package cn.qzbook.dao.Student;

import cn.qzbook.MybatisTool;
import cn.qzbook.domain.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

public class StudentDao {

    private SqlSession sqlSession = MybatisTool.sqlSessionFactory().openSession(true);

    /**
     * MyBatis插入[静态参数]
     * */
    public void insert(){
        sqlSession.insert("insert");
    }

    /**
     * MyBatis查询单条记录[静态参数--SQL写死在mapper文件]
     * */
    public Student selectOne(){
        Student student = sqlSession.selectOne("selectOne");
        return student;
    }

    /**
     * MyBatis查询多条记录[静态参数]
     * */
    public List<Student> selectList(){
        List<Student> students = sqlSession.selectList("selectList");

        return students;
    }

    /**
     * MyBatis查询表数据行统计 [自定义返回值类型---基本数据类型]
     * */
    public int selectCount(){
         int num = sqlSession.selectOne("selectCount");
         return num;
    }

    /**
     * MyBatis查询表数据，多行记录，且多个临时条件[多个自定义返回值--使用map<String,Object> -- 如果返回值的值类型不统一v可以使用object类型]
     * 最终返回自定义返回值[临时表 key==列名  value==值]
     * */
    public List<Map<String,Integer>> selectNameAndNum(){
        List<Map<String,Integer>> result = sqlSession.selectList("selectNameAndNum");
        return result;
    }

    /**
     * MyBatis插入数据[动态参数--domain对象]
     * insert / update / delete / select 都有对应的方法重载，第二个参数为需要传递的对象 [obj]
     * 在mapper文件中使用 #{key == 属性名} 或者 ${key == 属性名}
     * */
    public void insertByObj(Student student){
        sqlSession.insert("insertByObj",student);
    }

    /**
     * ${}   #{}  的区别
     * #{key}  : MyBatis匹配类型，如果是varchar 则为取到的值 添加  单引号 ，最后拼接到sql
     * ${key}  : MyBatis不匹配类型，取到的值直接放在当前位置
     * */
    public List<Student> selectOrderBy(String flag){
        List<Student> students = sqlSession.selectList("selectOrderBy");
        return students;
    }


}
